#include <iostream>
#include <xmmintrin.h> // 包含SSE指令集相关的头文件
#include <Windows.h>   // 包含Windows平台API头文件
#include <cstdlib>     // 包含 rand 函数
#include <ctime>       // 包含 time 函数

// 初始化矩阵为100以内的随机数
void initMatrix(float* A, int n) {
    srand(static_cast<unsigned int>(time(nullptr))); // 使用当前时间作为随机数种子
    for (int i = 0; i < n * n; ++i) {
        A[i] = static_cast<float>(rand() % 100); // 生成0到99的随机数
    }
}

// 计算高斯消去函数的运行时间
double gaussianEliminationTime(float* A, int n) {
    LARGE_INTEGER freq, head, tail;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&head);
    
    for (int k = 0; k < n - 1; ++k) {
        __m128 vt = _mm_loadu_ps(&A[k * n + k]);
        for (int j = k + 1; j + 4 <= n; j += 4) {
            __m128 va = _mm_loadu_ps(&A[k * n + j]);
            va = _mm_div_ps(va, vt);
            _mm_storeu_ps(&A[k * n + j], va);
        }
        for (int j = k + 1; j < n; ++j) {
            A[k * n + j] /= A[k * n + k];
        }
        A[k * n + k] = 1.0f;
        for (int i = k + 1; i < n; ++i) {
            __m128 vaik = _mm_loadu_ps(&A[i * n + k]);
            for (int j = k + 1; j + 4 <= n; j += 4) {
                __m128 vakj = _mm_loadu_ps(&A[k * n + j]);
                __m128 vaij = _mm_loadu_ps(&A[i * n + j]);
                __m128 vx = _mm_mul_ps(vakj, vaik);
                vaij = _mm_sub_ps(vaij, vx);
                _mm_storeu_ps(&A[i * n + j], vaij);
            }
            for (int j = k + 1; j < n; ++j) {
                A[i * n + j] -= A[k * n + j] * A[i * n + k];
            }
            A[i * n + k] = 0.0f;
        }
    }
    A[(n - 1) * n + n - 1] = 1.0f;

    QueryPerformanceCounter(&tail);
    return static_cast<double>(tail.QuadPart - head.QuadPart) * 1000.0 / freq.QuadPart;
}

int main() {
    const int n = 32; // 定义矩阵大小为32x32

    // 分配未对齐的内存
    float* A = new float[n * n];

    // 初始化矩阵为100以内的随机数
    initMatrix(A, n);

    // 计算高斯消去函数的运行时间
    double Mytime = gaussianEliminationTime(A, n);

    // 在这里打印结果或进行其他操作...
    std::cout << "高斯消元函数运行时间: " << Mytime << " ms" << std::endl;

    // 释放内存
    delete[] A;

    return 0;
}
